package models.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import models.entity.Perfil;
import models.entity.Reserva;
import models.entity.Usuario;
import models.entity.Vehiculo;
import utilidades.DataBaseInstance;

/**
 *
 * @author mmardones
 */
public class ReservaDao {
   
     public List<Reserva> getReserva(){
        List<Reserva> listaReserva = new LinkedList<Reserva>();
        ResultSet result = null;
     try {

            VehiculoDao v=new VehiculoDao();
            ReservaDao r=new ReservaDao();
            UsuarioDao u=new UsuarioDao();
            
            String query = "select "
                        + " r.ID_RESERVA,"
                        + " r.PATENTE,"
                        + " r.RUT_USUARIO,"
                        + " r.INICIO,"
                        + " r.TERMINO "
                    + "from "
                        + " USUARIO u,"
                        + " VEHICULO v,"
                        + " RESERVA r"                    
                    + "where "
                        + " r.PATENTE= v.PATENTE and r.RUT_USUARIO=u.RUT_USUARIO ";
            
            Connection conn  = DataBaseInstance.getInstanceConnection();
            Statement stmt = conn.createStatement();
            result = stmt.executeQuery(query);
            Usuario usuario;
            Vehiculo vehiculo;
            Reserva reserva;
            while (result.next()) {
                usuario=new Usuario();
                vehiculo=new Vehiculo();
                reserva=new Reserva();
                
                reserva.setId_reserva(result.getInt("ID_RESERVA"));
                reserva.setPatente(v.findById(result.getString("PATENTE")));
                reserva.setRut_usuario(u.findById(result.getString("RUT_USUARIO")));
                reserva.setInicio(result.getDate("INICIO"));
                reserva.setTermino(result.getDate("TERMINO"));
               
                listaReserva.add(reserva);
            }
            result.close();
            stmt.close();
            DataBaseInstance.closeConnection(conn);

        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return listaReserva;
    }
     public Reserva findById(String id) {
        ResultSet result = null;
        Usuario usuario = null;
        Reserva reserva =null;
        Vehiculo vehiculo = null;
        try {
            // Componemos la sentencia SQL para obtener los productos.
             String query = "select "
                        + " r.ID_RESERVA,"
                        + " r.PATENTE,"
                        + " r.RUT_USUARIO,"
                        + " r.INICIO,"
                        + " r.TERMINO "
                    + "from "
                        + " USUARIO u,"
                        + " VEHICULO v,"
                        + " RESERVA r"                    
                    + "where "
                        + " r.PATENTE= v.PATENTE and r.RUT_USUARIO=u.RUT_USUARIO "
                        + " RUT_USUARIO= ?";
            
            // Ejecutamos la query y obtenemos el resultado.
            Connection conn = DataBaseInstance.getInstanceConnection();
            PreparedStatement stmt = conn.prepareStatement(query);
            stmt.setString(1,id);
            result = stmt.executeQuery();

            // Vemos si no ha devuelto ningun resultado.
           
            VehiculoDao v=new VehiculoDao();
            ReservaDao r=new ReservaDao();
            UsuarioDao u=new UsuarioDao();
            
            while (result.next()) {
                usuario=new Usuario();
                vehiculo=new Vehiculo();
                reserva=new Reserva();
                reserva.setId_reserva(result.getInt("ID_RESERVA"));
                reserva.setPatente(v.findById(result.getString("PATENTE")));
                reserva.setRut_usuario(u.findById(result.getString("RUT_USUARIO")));
                reserva.setInicio(result.getDate("INICIO"));
                reserva.setTermino(result.getDate("TERMINO"));
                
            }
            result.close();
            stmt.close();
            DataBaseInstance.closeConnection(conn);

        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }

        return reserva;
    }
    
    public void Insertar(Reserva reserva) {
        Usuario usuario=reserva.getRut_usuario();
        Vehiculo vehiculo= reserva.getPatente();
        PreparedStatement saveProduct;
        try {
              Connection conn = DataBaseInstance.getInstanceConnection();
                saveProduct = conn.prepareStatement(
                        "INSERT INTO RESERVA (ID_RESERVA," 
                                            + " PATENTE,"
                                            + " RUT_USUARIO,"
                                            + " INICIO,"
                                            + " TERMINO,"                                 
                                            + "VALUES (?, ?, ?, ?, ?)");
                saveProduct.setInt(1,reserva.getId_reserva());
                saveProduct.setString(2,vehiculo.getPatente());
                saveProduct.setString(3, usuario.getRut());
                saveProduct.setDate(4, (Date) reserva.getInicio());
                saveProduct.setDate(5, (Date) reserva.getTermino());
             
                
                System.out.println("INSERT INTO ....");         

            saveProduct.executeUpdate();
            DataBaseInstance.closeConnection(conn);
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }
}